#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
基础资料主页面 - 整合4个子页面模块

此模块创建一个主页面，使用选项卡导航来整合4个基础资料子页面：
1. 房屋资料
2. 承租人资料
3. 出租人资料
4. 水电费标准
"""

# PyQt5组件导入
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QTabWidget, QMessageBox
from PyQt5.QtCore import Qt

# 导入子页面模块
from basic_data_modules import (
    HouseDataModule, 
    TenantDataModule, 
    LandlordDataModule, 
    UtilityFeeModule
)

# 导入日志模块
from logger_module import log_info, log_error, log_debug, log_warning


class BasicDataMainPage(QWidget):
    """基础资料主页面 - 包含选项卡导航的整合页面"""
    
    def __init__(self, conn=None):
        super().__init__()
        self.conn = conn  # 数据库连接
        self.current_module = None  # 当前显示的子页面模块
        self.initUI()
    
    def initUI(self):
        """初始化UI界面"""
        # 创建主布局
        main_layout = QVBoxLayout(self)
        
        # 创建选项卡控件
        self.tab_widget = QTabWidget()
        
        # 设置选项卡位置在上方
        self.tab_widget.setTabPosition(QTabWidget.North)
        
        # 设置选项卡形状为圆角矩形
        self.tab_widget.setTabShape(QTabWidget.Rounded)
        
        # 创建4个子页面模块，传入主页面引用以便模块间通信
        self.house_module = HouseDataModule(parent_page=self)
        self.tenant_module = TenantDataModule()
        self.landlord_module = LandlordDataModule()
        self.utility_fee_module = UtilityFeeModule()
        
        # 添加选项卡
        self.tab_widget.addTab(self.house_module, "房屋资料")
        self.tab_widget.addTab(self.tenant_module, "承租人资料")
        self.tab_widget.addTab(self.landlord_module, "出租人资料")
        self.tab_widget.addTab(self.utility_fee_module, "水电费标准")
        
        # 连接选项卡切换信号
        self.tab_widget.currentChanged.connect(self.onTabChanged)
        
        # 将选项卡控件添加到主布局
        main_layout.addWidget(self.tab_widget)
        
        # 设置初始的当前模块
        self.current_module = self.house_module
        
        # 如果有数据库连接，初始化第一个模块的数据
        if self.conn:
            self.house_module.loadHouses(self.conn)
    
    def setDatabaseConnection(self, conn):
        """设置数据库连接并初始化所有模块"""
        self.conn = conn
        
        try:
            # 初始化所有子模块的数据
            self.house_module.loadHouses(conn)
            self.tenant_module.loadTenants(conn)
            self.landlord_module.loadLandlords(conn)
            self.utility_fee_module.loadUtilityFees(conn)
            
            log_info("基础资料页面所有模块数据加载完成")
        except Exception as e:
            log_error(f"加载基础资料模块数据失败: {str(e)}")
            QMessageBox.critical(self, "错误", f"加载基础资料模块数据失败: {str(e)}")
    
    def onTabChanged(self, index):
        """处理选项卡切换事件"""
        try:
            # 根据索引获取当前模块
            if index == 0:
                self.current_module = self.house_module
                log_info("切换到房屋资料页面")
            elif index == 1:
                self.current_module = self.tenant_module
                log_info("切换到承租人资料页面")
            elif index == 2:
                self.current_module = self.landlord_module
                log_info("切换到出租人资料页面")
            elif index == 3:
                self.current_module = self.utility_fee_module
                log_info("切换到水电费标准页面")
            
            # 确保当前模块的数据是最新的
            if self.conn and self.current_module:
                if hasattr(self.current_module, 'queryHouses'):
                    self.current_module.queryHouses()
                elif hasattr(self.current_module, 'queryTenants'):
                    self.current_module.queryTenants()
                elif hasattr(self.current_module, 'queryLandlords'):
                    self.current_module.queryLandlords()
                elif hasattr(self.current_module, 'queryUtilityFees'):
                    self.current_module.queryUtilityFees()
        except Exception as e:
            log_error(f"切换选项卡时发生错误: {str(e)}")
    
    def refreshCurrentModule(self):
        """刷新当前显示的模块数据"""
        try:
            if not self.current_module:
                return
                
            # 根据模块类型调用相应的查询方法
            if hasattr(self.current_module, 'queryHouses'):
                self.current_module.queryHouses()
                log_info("刷新房屋资料模块")
            elif hasattr(self.current_module, 'queryTenants'):
                self.current_module.queryTenants()
                log_info("刷新承租人资料模块")
            elif hasattr(self.current_module, 'queryLandlords'):
                self.current_module.queryLandlords()
                log_info("刷新出租人资料模块")
            elif hasattr(self.current_module, 'queryUtilityFees'):
                self.current_module.queryUtilityFees()
                log_info("刷新水电费标准模块")
        except Exception as e:
            log_error(f"刷新模块数据时发生错误: {str(e)}")
            QMessageBox.critical(self, "错误", f"刷新模块数据时发生错误: {str(e)}")
    
    def refreshAllModules(self):
        """刷新所有模块的数据"""
        try:
            log_info("开始刷新所有基础资料模块数据")
            
            # 刷新所有模块 - 移除对self.conn的检查
            # 即使没有直接传入连接，每个子模块内部也会有自己的错误处理
            self.house_module.queryHouses()
            self.tenant_module.queryTenants()
            self.landlord_module.queryLandlords()
            self.utility_fee_module.queryUtilityFees()
            
            log_info("所有基础资料模块数据刷新完成")
        except Exception as e:
            log_error(f"刷新所有模块数据时发生错误: {str(e)}")
            QMessageBox.critical(self, "错误", f"刷新所有模块数据时发生错误: {str(e)}")
    
    def resetCurrentModuleForm(self):
        """重置当前显示模块的表单"""
        try:
            if not self.current_module:
                return
                
            # 根据模块类型调用相应的重置方法
            if hasattr(self.current_module, 'resetForm'):
                self.current_module.resetForm()
                log_info("重置房屋资料表单")
            elif hasattr(self.current_module, 'resetTenantForm'):
                self.current_module.resetTenantForm()
                log_info("重置承租人资料表单")
            elif hasattr(self.current_module, 'resetLandlordForm'):
                self.current_module.resetLandlordForm()
                log_info("重置出租人资料表单")
            elif hasattr(self.current_module, 'resetUtilityFeeForm'):
                self.current_module.resetUtilityFeeForm()
                log_info("重置水电费标准表单")
        except Exception as e:
            log_error(f"重置表单时发生错误: {str(e)}")
    
    def getCurrentModuleType(self):
        """获取当前模块的类型名称"""
        if not self.current_module:
            return "未知"
            
        if isinstance(self.current_module, HouseDataModule):
            return "房屋资料"
        elif isinstance(self.current_module, TenantDataModule):
            return "承租人资料"
        elif isinstance(self.current_module, LandlordDataModule):
            return "出租人资料"
        elif isinstance(self.current_module, UtilityFeeModule):
            return "水电费标准"
        else:
            return "未知"
    
    def keyPressEvent(self, event):
        """处理键盘事件，添加快捷键支持"""
        # F5 刷新当前模块
        if event.key() == Qt.Key_F5 and not event.isAutoRepeat():
            self.refreshCurrentModule()
            event.accept()
        # Ctrl+R 刷新所有模块
        elif event.key() == Qt.Key_R and event.modifiers() == Qt.ControlModifier and not event.isAutoRepeat():
            self.refreshAllModules()
            event.accept()
        # Esc 重置当前模块表单
        elif event.key() == Qt.Key_Escape and not event.isAutoRepeat():
            self.resetCurrentModuleForm()
            event.accept()
        else:
            super().keyPressEvent(event)